001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Feb 14, 2003 005 * Time: 8:45:05 PM 006 */ 007 008 package EVolve.util.painters; 009 010 import EVolve.visualization.AutoImage; 011 import EVolve.util.painters.shapes.*; 012 import EVolve.util.painters.shapes.Shape; 013 import java.util.*; 014 import java.awt.*; 015 016 public class RelationshipPainter extends Painter{ 017 private int[][] value; 018 private HashMap[] axis; 019 private int shapeSize; 020 private int threshold; 021 private long entity_type_1, entity_type_2; 022 023 public RelationshipPainter() { 024 axis = new HashMap[2]; 025 } 026 027 public String getName() { 028 return "Relationship Painter"; 029 } 030 031 public void updatePainterParameters(int[][] value, int threshold) { 032 this.value = value; 033 this.threshold = threshold; 034 } 035 036 public void paint(AutoImage image, long x, long y, long z) { 037 /* 038 here x and y stands for the entity type of 039 two axis, z stands for the edge length of the box 040 or diameter of the ball 041 */ 042 clearImage(image); 043 entity_type_1 = x; 044 entity_type_2 = y; 045 axis[0] = new HashMap(); 046 axis[1] = new HashMap(); 047 shapeSize = (int)z; 048 049 int w = value.length, h = value[0].length; 050 051 for (int j=0; j<h; j++) { 052 Shape consumer = null; 053 for (int i=0; i<w; i++) { 054 if (value[i][j]>=threshold) { 055 consumer = new Ball(y,j,shapeSize); 056 consumer.setColor(Color.black); 057 image.setColor(i,j,consumer); 058 axis[1].put(new Integer(axis[1].size()),consumer); 059 break; 060 } 061 } 062 } 063 064 065 for (int i=0; i<w; i++) { 066 Shape producer = null; 067 for (int j=0; j<h; j++) { 068 if (value[i][j] >= threshold) { 069 Shape consumer = findConsumer(j); 070 producer = new Box(x,i,shapeSize,shapeSize); 071 producer.setColor(Color.black); 072 image.setColor(i,j,producer); 073 axis[0].put(new Integer(axis[0].size()),producer); 074 producer.addConsumer(consumer,value[i][j]); 075 } 076 } 077 } 078 } 079 080 public Shape getEntityShape(int x, int y) { 081 int totalShapes = axis[0].size() + axis[1].size(); 082 083 int i = 0,producerSize = axis[0].size(); 084 while (i<totalShapes) { 085 Iterator it = axis[i/producerSize].keySet().iterator(); 086 while (it.hasNext()) { 087 Object key = it.next(); 088 Shape object = (Shape)axis[i/producerSize].get(key); 089 if (object.insideShape(x,y)) { 090 return object; 091 } 092 } 093 i += axis[i/producerSize].size(); 094 } 095 return null; 096 } 097 098 public HashMap getEntitiesInBox(int startX, int startY, int endX, int endY) { 099 HashMap result = new HashMap(); 100 for (int i=0; i<axis.length; i++) { 101 ArrayList ids = new ArrayList(); 102 int targetType = -1; 103 for (int j=0; j<axis[i].size(); j++) { 104 Shape object = (Shape)axis[i].get(new Integer(j)); 105 targetType = (int)object.getEntityType(); 106 if (inside(object,startX,startY,endX,endY)) 107 ids.add(new Long(object.getEntityID())); 108 } 109 if (targetType!= -1) result.put(new Integer(targetType),ids); 110 } 111 return result; 112 } 113 114 private Shape findConsumer(int entityId) { 115 Iterator it = axis[1].keySet().iterator(); 116 while (it.hasNext()) { 117 Shape object = (Shape)axis[1].get(it.next()); 118 if (object.getEntityID() == entityId) 119 return object; 120 } 121 return null; 122 } 123 124 private boolean inside(Shape object, int startX, int startY, int endX, int endY) { 125 if ((startX<=object.x)&&(object.x<=endX)&&(startY<=object.y)&&(object.y<=endY)) 126 return true; 127 return false; 128 } 129 130 private void clearImage(AutoImage image) { 131 short[][] data = image.getImageDataArray(); 132 for (int i=0; i<data.length; i++) 133 for (int j=0; j<data[i].length; j++) 134 data[i][j] = 0; 135 } 136 137 public Object clone() { 138 RelationshipPainter o = (RelationshipPainter)super.clone(); 139 o.axis = new HashMap[2]; 140 o.axis[0] = new HashMap(); 141 o.axis[1] = new HashMap(); 142 143 int w = value.length, h = value[0].length; 144 for (int i=0; i<w; i++) { 145 Shape producer = null; 146 for (int j=0; j<h; j++) { 147 if (value[i][j] >= threshold) { 148 Shape consumer = o.findConsumer(j); 149 if (producer == null) { 150 producer = new Box(entity_type_1,i,shapeSize,shapeSize); 151 o.axis[0].put(new Integer(o.axis[0].size()),producer); 152 } 153 if (consumer == null) { 154 consumer = new Ball(entity_type_2,j,shapeSize); 155 o.axis[1].put(new Integer(o.axis[1].size()),consumer); 156 } 157 producer.addConsumer(consumer,value[i][j]); 158 } 159 } 160 } 161 162 return o; 163 } 164 }